package com.zmn.mcc.cas.server;

import com.zmn.common.constant.StatusConsts;
import com.zmn.common.dictionary.KvModel;
import com.zmn.common.dto2.ResponseDTO;
import com.zmn.mcc.cas.model.CasSysDRO;
import com.zmn.mcc.cas.model.LoginStaff;
import com.zmn.mcc.common.dto.permit.PermitLitDO;
import com.zmn.mcc.common.dto.permit.SpermitDTO;
import com.zmn.mcc.common.dto.staff.LoginStaffDO;
import com.zmn.mcc.model.entity.permit.McPermit;
import com.zmn.mcc.model.entity.staff.McStaff;

import java.util.List;

/**
 * @author quanjic
 * @version v1.0
 * @since 2020/6/15 11:02
 **/
public interface CasServerStaffService {

    /**
     * 登录类型：登录
     */
    Integer LOGIN_TYPE_IN = 1;

    /**
     * 登录类型：登出
     */
    Integer LOGIN_TYPE_OUT = 2;

    /**
     * 登录类型：踢出
     */
    Integer LOGIN_TYPE_KICK = 3;


    /**
     * 登录状态：成功
     */
    Integer LOGIN_STATUS_SUCCESS = 2;

    /**
     * 登录状态：失败
     */
    Integer LOGIN_STATUS_Fail = 1;

    /**
     * 查询指定公司所在城市区域代码
     *
     * @param companyId 公司ID
     * @return 城市区域代码或者<code>null</code>
     */
    Integer getCityIdByCompanyId(Integer companyId);

    /**
     * 带有角色与数据权限关联字段
     *
     * @param staff
     * @return
     */
    LoginStaff getLoginStaffDOByMcStaff(McStaff staff);

    /**
     * 查询指定员工ID关联的角色ID列表；如员工未自定义功能权限，则继承部门默认角色
     *
     * @param staffId 员工ID
     * @return 角色ID列表(非 < code > null < / code >)
     */
    List<Integer> listAvailableRoleIdsByStaffId(Integer staffId);

    /**
     * 查询用户权限
     *
     * @param roleIds 角色ID列表(不能为空或者<code>null</code>)
     * @return 权限列表(非 < code > null < / code >)
     */
//    @Deprecated
//    List<McPermit> listPermitByRoleIds(List<Integer> roleIds);

    /**
     * 查询用户权限列表
     *
     * @param staffId 员工ID
     * @return 权限列表(非 < code > null < / code >)
     */
    @Deprecated
    List<McPermit> listPermitByStaffId(Integer staffId);


    /**
     * 查询用户当前应用的权限列表
     *
     * @param staff 员工登录信息
     * @return 权限列表(非 < code > null < / code >)
     */
    List<PermitLitDO> listPermitOfCurrentAppByStaffId(LoginStaff staff);

    /**
     * @return 所有应用名称与URL
     */
    List<CasSysDRO> listApp();

    /**
     * 查询指定员工登录名关联的员工实例
     *
     * @param staffNameOrMobile 员工登录名或者手机号码(非空或者非<code>null</code>)
     * @return
     */
    McStaff queryStaff(String staffNameOrMobile);

    /**
     * 查询钉钉userid绑定的员工
     *
     * @param dingTalkUserId
     * @return
     */
    McStaff queryStaffByDTalkId(String dingTalkUserId);

    /**
     * 检查用户与密码(1.用户密码 2.临时密码)
     *
     * @param staffName 可以是手机号码,根据格式自动判断
     * @param password  未加密的密码
     * @return
     */
    ResponseDTO<McStaff> checkPassword(String staffName, String password);

    /**
     * 检查用户与钉钉Userid
     * @param staffName 只能是name，不存在是手机号的情况
     * @param dTalkUserId 钉钉UserId
     * @return
     */
    ResponseDTO<McStaff> checkDTalkUserId(String staffName, String dTalkUserId);
    /**
     * 修改员工最后登录时间
     *
     * @param staffId 员工ID
     * @return
     */
    void updateLastLoginTime(Integer staffId);


    /**
     * @param staffId          员工ID
     * @param password         新密码
     * @param operatorUserName 操作者
     */
    void updatePassword(Integer staffId, String password, String operatorUserName);

    /**
     * 绑定钉钉userId
     *
     * @param staff
     */
    void updateDTalkId(McStaff staff);
    /**
     * 保存登录日志
     *
     * @param loginType     登录类型
     * @param loginStatus   登录结果状态
     * @param statusCode    结果代码({@link StatusConsts#STATUS_SUCCESS}：成功，{@link StatusConsts#STATUS_ERROR}：失败)
     * @param statusMessage 消息
     * @see #LOGIN_TYPE_IN
     * @see #LOGIN_TYPE_OUT
     * @see #LOGIN_TYPE_KICK
     * @see #LOGIN_STATUS_SUCCESS
     * @see #LOGIN_STATUS_Fail
     */
    @Deprecated
    void saveLoginLog(int loginType, int loginStatus, int statusCode, String statusMessage);

}
